/**
 * @file date.h
 * @brief Fichier d'entête du module date.
 *
 * @author Delory Rachid, Keita Mamadou, Florian Bernard
 */
#ifndef H_DATE_H
#define H_DATE_H

/* *********************************************************************                                                                      
                   Librairies de Date                                                                                                     
 ********************************************************************* */
#include <stdio.h>
#include <stdlib.h>

/* *********************************************************************                                                                        
                        Définitions de types                                                                                               
 ********************************************************************* */

/**
 * @struct sDate
 * @brief Structure utilisée pour la gestion des dates.
 *
 * Cette structure est utilisée pour gérer une date.
 Les champs de cette structures doivent être modifiés ou lus
 par les accesseurs et mutateurs.
 */

struct sDate {
  unsigned int id; /** Id de la date dans la base de donnée */
  unsigned char jour; /** Jour */
  unsigned char mois; /** Mois */
  signed int annee; /** Années */
  char maj;
  char sup;
} ;

/**
 * @typedef Date
 * @brief Redéfinit la structure sDate
 */
typedef struct sDate Date ;

/* *********************************************************************
         	 Fonction de la structure Date                               
********************************************************************* */

/**
 * @fn Date * creer_Dat() ;
 * @brief Crée une date dans le tas
 *
 * @return un pointeur sur Date
 */
Date * creer_Dat();

/**
 * @fn void init_Dat(Date * date);
 * @brief Initilise une date
 *
 * @param[in,out] Date pointeur sur Date
 */
void init_Dat(Date * date);

/**
 * @fn void liberer_Dat(Date * date);
 * @brief Libère la date
 *
 * @param[in,out] date pointeur sur Date
 */
void liberer_Dat(Date * date);

/**
 * @fn void detruire_Dat(Date ** date);
 * @brief Détruis une date du tas
 * 
 * @param[in,out] date pointeur sur Date
 */
void detruire_Dat(Date ** date);

/**
 * @fn void cpy_Dat(Date * dateDest, const Date * dateSrc);
 * @brief Copie dans dateDest la dateSrc
 * 
 * @param[in,out] dateDest pointeur sur Date
 * @param dateSrc la date que l'on veut copier
 */
void copier_Dat(Date ** dateDest, const Date * dateSrc);

/* *********************************************************************                                                                       
           Accesseurs et Mutateurs de la structure Date                                                                                    
 ********************************************************************* */

/**
 * @fn unsigned char getId_Dat(const Date date) ;
 * @brief récupère le id de date
 *
 * @param date 
 * @return le id de date
 */
unsigned int getId_Dat(const Date *date) ;

/**
 * @fn void setId_Dat(Date date, unsigned char id) ;
 * @brief initialise le id de la date
 *
 * @param[in, out] date date à modifier
 * @param id
 */
void setId_Dat(Date *date, const unsigned int id) ;


/**
 * @fn unsigned char getJour_Dat(const Date date) ;
 * @brief récupère le jour de date
 *
 * @param date 
 * @return le jour de date
 */
unsigned char getJour_Dat(const Date *date) ;

/**
 * @fn void setJour_Dat(Date date, unsigned char jour) ;
 * @brief initialise le jour de la date
 *
 * @param[in, out] date date à modifier
 * @param jour
 */
void setJour_Dat(Date *date, const unsigned char jour) ;


/**
 * @fn unsigned char getMois_Dat(const Date date) ;
 * @brief récupère le mois de date
 *
 * @param date 
 * @return le mois de date
 */
unsigned char getMois_Dat(const Date *date) ;

/**
 * @fn void setMois_Dat(Date date, unsigned char mois) ;
 * @brief initialise le mois de la date
 *
 * @param[in, out] date date à modifier
 * @param mois
 */
void setMois_Dat(Date *date, const unsigned char mois) ;

/**
 * @fn signed int getAnnee_Dat(const Date date) ;
 * @brief récupère l'annee de date
 *
 * @param date 
 * @return l'annee de date
 */
signed int getAnnee_Dat(const Date *date) ;

/**
 * @fn void setAnnee_Dat(Date date, signed int int) ;
 * @brief initialise l'année de la date
 *
 * @param[in, out] date date à modifier
 * @param année
 */
void setAnnee_Dat(Date *date, const signed int annee) ;

/**
 * @fn char * getDate_Dat(Date *date) ;
 * @brief récupère la date complète.
 *
 * @param[in, out] date date à récupérer.
 */
char * getDate_Dat(Date *date);

/**
 * @fn void setMaj_Dat(Date *ptr, const char b);
 * @brief Set le besoin de faire une mise à jour, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setMaj_Dat(Date *ptr, const char b);

/**
 * @fn char getMaj_Dat(const Date *ptr);
 * @brief Retourne 0 si pas besoin de faire la mise à jour, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getMaj_Dat(const Date *ptr);

/**
 * @fn void setSup_Dat(Date *ptr, const char b);
 * @brief Set le besoin de le supprimer, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setSup_Dat(Date *ptr, const char b);

/**
 * @fn char getSup_Dat(const Date *ptr);
 * @brief Retourne 0 si pas besoin de le supprimer, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getSup_Dat(const Date *ptr);

/**
 * @fn void regression_Dat() ;
 * @brief Test le module Date
 */
void regression_Dat();

#endif
